package br.uniceub.fsw.talentos.dao;

import br.uniceub.fsw.arquitetura.persistencia.dao.BaseDAO;
import br.uniceub.fsw.arquitetura.persistencia.dao.ConstrutorSQL;
import br.uniceub.fsw.talentos.vo.TalentoVO;
import br.uniceub.fsw.talentos.vo.HabilidadeVO;
import br.uniceub.fsw.talentos.vo.PerfilVO;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/** 
 * Data Access Object da entidade TB_Talento. Essa classe é responsável por todas as 
 * operações de banco de dados relacionadas à entidade.* 
 *
 * @author Bruno Cesar Fernandes 2013498/7
 *         Bruno Henrique Sousa do Val
 */
public class TalentoDAO extends BaseDAO<TalentoVO> {
    
    @Override
    public void inserir(TalentoVO talento) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("INSERT INTO TB_Talento(CD_GrupoTrabalho, NO_Talento, NR_CPF,");
        query.append("MT_RegistroUniceub, SG_Sexo, TL_Principal, TL_Secundario,");
        query.append("ED_Talento, NO_Cidade, SG_UF, NR_CEP, DT_Nascimento, EE_Talento)");
        query.append("VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");

        List<?> parametros = criarParametros(talento.getCdGrupoTrabalho(),
                talento.getNoTalento(), talento.getNrCPF(), talento.getMtRegistroUniceub(),
                talento.getSgSexo(), talento.getTlPrincipal(), talento.getTlSecundario(),
                talento.getEdTalento(), talento.getNoCidade(), talento.getSgUF(),
                talento.getNrCEP(), talento.getDtNascimento(), talento.getEeTalento());

        Integer idGerado = ((Long) executarInsercao(query.toString(), parametros)).intValue();

        talento.setIdTalento(idGerado);
    } 
    
    @Override
    public void alterar(TalentoVO talento) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("UPDATE TB_Talento SET CD_GrupoTrabalho = ?,");
        query.append("NO_Talento = ?,");
        query.append("NR_CPF = ?");
        query.append("MT_RegistroUniceub = ?");
        query.append("SG_Sexo = ?");
        query.append("TL_Principal = ?");
        query.append("TL_Secundario = ?");
        query.append("ED_Talento = ?");
        query.append("NO_Cidade = ?");
        query.append("SG_UF = ?");
        query.append("NR_CEP = ?");
        query.append("DT_Nascimento = ?");
        query.append("EE_Talento = ?");
        query.append("WHERE ID_Talento = ?");

        List<?> parametros = criarParametros(talento.getCdGrupoTrabalho(),
                talento.getNoTalento(), talento.getNrCPF(), talento.getMtRegistroUniceub(),
                talento.getSgSexo(), talento.getTlPrincipal(), talento.getTlSecundario(),
                talento.getEdTalento(), talento.getNoCidade(), talento.getSgUF(),
                talento.getNrCEP(), talento.getDtNascimento(), talento.getEeTalento(),
                talento.getIdTalento());

        executarAlteracao(query.toString(), parametros);
    }  
    
    @Override
    public void excluir(TalentoVO talento) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("DELETE FROM TB_Talento");
        query.append("WHERE ID_Talento = ?");

        executarAlteracao(query.toString(), criarParametros(talento.getIdTalento()));
    }  
    
    @Override
    public TalentoVO consultarPorId(Serializable id) {

        TalentoVO talento = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_Talento T WHERE T.ID_Talento = ?");

        talento = consultarUm(query.toString(), criarParametros(id));

        return talento;
    }
    
    @Override
    public List<TalentoVO> consultarPorExemplo(TalentoVO talento) {

        List<TalentoVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_Talento T WHERE 1=1");

        mapearQueryParaExemplo(query, talento);

        listaRetorno = consultar(query.toString(), recuperarParametros());

        return listaRetorno;
    } 

    public List<TalentoVO> consultarPorExemploPorParametros(TalentoVO talento, HabilidadeVO habilidade, PerfilVO perfil) {

        List<TalentoVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TB_TALENTO T");
        
        if(habilidade != null || perfil != null) {
            query.append(", TB_CAPACITACAO C, TB_HABILIDADE H");
        }
        
        if(perfil != null) {
            query.append(", TA_HABILIDADEPERFIL HP, TB_PERFIL P");
        }
        
        query.append("WHERE 1=1");

        if(habilidade != null || perfil != null) {
            query.append("AND T.ID_TALENTO = C.CD_TALENTO");
            query.append("AND C.CD_HABILIDADE = H.ID_HABILIDADE");
        }
        
        if(perfil != null) {
            query.append("AND H.ID_HABILIDADE = HP.CD_HABILIDADE");
            query.append("AND HP.CD_PERFIL = P.ID_PERFIL");
        }
        
        mapearQueryParaExemploParaParametros(query, talento, habilidade, perfil);

        listaRetorno = consultar(query.toString(), recuperarParametros());

        return listaRetorno;
    } 

    @Override
    protected TalentoVO extrairObjetoResultado(ResultSet rs) throws SQLException {

        TalentoVO talento = new TalentoVO();
        
        talento.setIdTalento(rs.getInt("ID_Talento"));
        talento.setCdGrupoTrabalho(new Integer(rs.getInt("CD_GrupoTrabalho")));
        talento.setNoTalento(rs.getString("NO_Talento"));
        talento.setNrCPF(rs.getString("NR_CPF"));
        talento.setMtRegistroUniceub(rs.getInt("MT_RegistroUniceub"));
        talento.setSgSexo(new Character(rs.getString("SG_Sexo").charAt(0)));
        talento.setTlPrincipal(rs.getString("TL_Principal"));
        talento.setTlSecundario(rs.getString("TL_Secundario"));
        talento.setEdTalento(rs.getString("ED_Talento"));
        talento.setNoCidade(rs.getString("NO_Cidade"));
        talento.setSgUF(rs.getString("SG_UF"));
        talento.setNrCEP(rs.getString("NR_CEP"));
        talento.setDtNascimento(rs.getDate("DT_Nascimento"));
        talento.setEeTalento(rs.getString("EE_Talento"));

        return talento;
    } 
    
    @Override
    protected void mapearQueryParaExemplo(ConstrutorSQL query, TalentoVO talento) {

        if (talento.getCdGrupoTrabalho() != null) {
            query.append("AND T.CD_GrupoTrabalho = ?");
            adicionarParametro(talento.getCdGrupoTrabalho());
        }        
        
        if (talento.getNoTalento() != null && talento.getNoTalento().trim().length() > 0) {
            query.append("AND T.NO_Talento LIKE ?");
            adicionarParametro("%" + talento.getNoTalento() + "%");
        }
        
        if (talento.getNrCPF() != null && talento.getNrCPF().trim().length() > 0) {
            query.append("AND T.NR_CPF LIKE ?");
            adicionarParametro("%" + talento.getNrCPF() + "%");
        }        

        if (talento.getMtRegistroUniceub() != null) {
            query.append("AND T.MT_RegistroUniceub = ?");
            adicionarParametro(talento.getMtRegistroUniceub());
        }
        
        if (talento.getSgSexo() != null) {
            query.append("AND T.SG_Sexo = ?");
            adicionarParametro(talento.getSgSexo());
        }
        
        if (talento.getTlPrincipal() != null && talento.getTlPrincipal().trim().length() > 0) {
            query.append("AND T.TL_Principal LIKE ?");
            adicionarParametro("%" + talento.getTlPrincipal() + "%");
        }
        
        if (talento.getTlSecundario() != null && talento.getTlSecundario().trim().length() > 0) {
            query.append("AND T.TL_Secundario LIKE ?");
            adicionarParametro("%" + talento.getTlSecundario() + "%");
        } 
        
        if (talento.getEdTalento() != null && talento.getEdTalento().trim().length() > 0) {
            query.append("AND T.ED_Talento LIKE ?");
            adicionarParametro("%" + talento.getEdTalento() + "%");
        } 
        
        if (talento.getNoCidade() != null && talento.getNoCidade().trim().length() > 0) {
            query.append("AND T.NO_Cidade LIKE ?");
            adicionarParametro("%" + talento.getNoCidade() + "%");
        }  
        
        if (talento.getSgUF() != null && talento.getSgUF().trim().length() > 0) {
            query.append("AND T.SG_UF LIKE ?");
            adicionarParametro("%" + talento.getSgUF() + "%");
        }
        
        if (talento.getNrCEP() != null && talento.getNrCEP().trim().length() > 0) {
            query.append("AND T.NR_CEP LIKE ?");
            adicionarParametro("%" + talento.getNrCEP() + "%");
        }
        
        if (talento.getDtNascimento() != null) {
            query.append("AND T.DT_Nascimento LIKE ?");
            adicionarParametro("%" + talento.getDtNascimento() + "%");
        }
        
        if (talento.getEeTalento() != null && talento.getEeTalento().trim().length() > 0) {
            query.append("AND T.EE_Talento LIKE ?");
            adicionarParametro("%" + talento.getEeTalento() + "%");
        }        
    }    

    protected void mapearQueryParaExemploParaParametros(ConstrutorSQL query, TalentoVO talento, HabilidadeVO habilidade, PerfilVO perfil) {

        if (talento.getCdGrupoTrabalho() != null) {
            query.append("AND T.CD_GrupoTrabalho = ?");
            adicionarParametro(talento.getCdGrupoTrabalho());
        }        
        
        if (talento.getNoTalento() != null && talento.getNoTalento().trim().length() > 0) {
            query.append("AND T.NO_Talento LIKE ?");
            adicionarParametro("%" + talento.getNoTalento() + "%");
        }
        
        if (talento.getNrCPF() != null && talento.getNrCPF().trim().length() > 0) {
            query.append("AND T.NR_CPF LIKE ?");
            adicionarParametro("%" + talento.getNrCPF() + "%");
        }        

        if (talento.getMtRegistroUniceub() != null) {
            query.append("AND T.MT_RegistroUniceub = ?");
            adicionarParametro(talento.getMtRegistroUniceub());
        }
        
        if (talento.getSgSexo() != null) {
            query.append("AND T.SG_Sexo = ?");
            adicionarParametro(talento.getSgSexo());
        }
        
        if (talento.getTlPrincipal() != null && talento.getTlPrincipal().trim().length() > 0) {
            query.append("AND T.TL_Principal LIKE ?");
            adicionarParametro("%" + talento.getTlPrincipal() + "%");
        }
        
        if (talento.getTlSecundario() != null && talento.getTlSecundario().trim().length() > 0) {
            query.append("AND T.TL_Secundario LIKE ?");
            adicionarParametro("%" + talento.getTlSecundario() + "%");
        } 
        
        if (talento.getEdTalento() != null && talento.getEdTalento().trim().length() > 0) {
            query.append("AND T.ED_Talento LIKE ?");
            adicionarParametro("%" + talento.getEdTalento() + "%");
        } 
        
        if (talento.getNoCidade() != null && talento.getNoCidade().trim().length() > 0) {
            query.append("AND T.NO_Cidade LIKE ?");
            adicionarParametro("%" + talento.getNoCidade() + "%");
        }  
        
        if (talento.getSgUF() != null && talento.getSgUF().trim().length() > 0) {
            query.append("AND T.SG_UF LIKE ?");
            adicionarParametro("%" + talento.getSgUF() + "%");
        }
        
        if (talento.getNrCEP() != null && talento.getNrCEP().trim().length() > 0) {
            query.append("AND T.NR_CEP LIKE ?");
            adicionarParametro("%" + talento.getNrCEP() + "%");
        }
        
        if (talento.getDtNascimento() != null) {
            query.append("AND T.DT_Nascimento LIKE ?");
            adicionarParametro("%" + talento.getDtNascimento() + "%");
        }
        
        if (talento.getEeTalento() != null && talento.getEeTalento().trim().length() > 0) {
            query.append("AND T.EE_Talento LIKE ?");
            adicionarParametro("%" + talento.getEeTalento() + "%");
        }
        
        if (habilidade != null) {
            query.append("AND H.ID_HABILIDADE = ?");
            adicionarParametro(habilidade.getIdHabilidade());
        }
        
        if(perfil != null) {
            query.append("AND P.ID_PERFIL = ?");
            adicionarParametro(perfil.getIdPerfil());
        }
    }    
}
